//
//  WBTabBarController.swift
//  仿微博
//
//  Created by RaoBo on 2018/12/4.
//  Copyright © 2018年 RB. All rights reserved.
//
//  Swift 所有的类、都是漏着的,
//  先用Private 护着，需要全局共享的时候在 去掉。
import UIKit

class WBTabBarController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        setupChildControllers()
        
        setupComposetButton()
    }
    
    //MARK: - 12-12 使用代码设置设备横竖屏幕
    /**
     portrait : 竖屏 肖像
     landscape: 横盘风景画
     
     - 使用代码控制设备方向，可以在需要横盘的时候，单独处理、
     - 设置支持的访问之后,当前的控制器都会遵守这个方向！
     - 播放视频，一般都是 modal 展现的。
     */
    override var supportedInterfaceOrientations: UIInterfaceOrientationMask {
        return .portrait
    }
    
    //MARK:-撰写微博监听方法,最重要的代码放在最前面
    //@objc:用OC的方式进行访问:在运行时通过OC的消息机制被调用。
    //private 私有,仅在当前对象使用。
    @objc private func clickComposeButtonAction() {
        print("点击了撰写按钮")
        //测试设备方向 command + 左右箭头
        let vc = UIViewController();
        vc.view.backgroundColor = UIColor.hm_random()
        let nav = UINavigationController(rootViewController: vc)
        present(nav, animated: true, completion: nil);
    }
    
    //MARK:-私有属性
    //撰写按钮
    private lazy var composeButton:UIButton = UIButton.hm_button(withImageName: "tabbar_compose_icon_add", backImageName: "tabbar_compose_button", highlightSuffix: "tabbar_compose_icon_add_highlighted")
}

//extension 类似OC的分类,可以分给代码,功能相近的放在一起
//和OC的分类一样,只能添加方法不能添加属性
extension WBTabBarController {
    
    //设置撰写按钮
    private func setupComposetButton() {
        //1>添加到tabar上
        tabBar.addSubview(composeButton)
        
        //2>计算按钮宽度
        let count = CGFloat(childViewControllers.count)
        //小技巧:-1 让中间的撰写按钮大一点,挡住左右容错点。
        let w = tabBar.bounds.width / count - 1;
        
        
        //3>向内缩进1px
        //CGRectInset 正数向内缩进,负数向外扩展
        composeButton.frame = tabBar.bounds.insetBy(dx: 2*w, dy: 0)
//        print("撰写按钮的frame:\(composeButton.frame)")
        
        //4.监听方法
        composeButton.addTarget(self, action: #selector(clickComposeButtonAction), for: .touchUpInside)
    }
    
    //设置所有子控制器
    private func setupChildControllers() {
        guard let  path = Bundle.main.path(forResource: "base.json", ofType: ""),
            let data = NSData.init(contentsOfFile: path),
            let array = try? JSONSerialization.jsonObject(with: data as Data, options: []) as? [[String:Any]]
        else {
            return
        }
        
        var arrayM = [UIViewController]();
        for dict in array! {
            arrayM.append(controller(dict: dict))
        }
        
        viewControllers = arrayM
    }
    
    /// 使用字典创建一个子控制器
    ///
    /// - Parameter dict: 字典
    /// - Returns: 创建好的子控制器
    private func controller(dict: [String:Any]) -> UIViewController {
        //1.取得字典内容
        guard let clsName = dict["clsName"] as? String,
            let title = dict["title"] as? String,
            let imageName = dict["imageName"] as? String,
        let visitorInfo = dict["visitInfo"] as? [String:String],
        let cls = NSClassFromString(Bundle.main.namespace + "." + clsName) as? WBBaseViewController.Type else {
                return UIViewController()
        }
        
        //2.创建视图控制器
        let vc = cls.init()
        vc.title = title
        //12-23传递访客视图信息字典
        vc.visitInfoDictionary = visitorInfo; //二道贩子
        //3.设置tabbar图像
        vc.tabBarItem.image = UIImage(named: "tabbar_" + imageName);
        vc.tabBarItem.selectedImage = UIImage(named: "tabbar_" + imageName + "_highlighted")?.withRenderingMode(.alwaysOriginal)//渲染颜色
        
        //不行你就点一下 .
        //4.设置 tabar 字体颜色 ,天天变
        vc.tabBarItem.setTitleTextAttributes([NSAttributedStringKey.foregroundColor:UIColor.orange], for: .selected)
//        vc.tabBarItem.setBadgeTextAttributes([NSAttributedStringKey.font.rawValue:UIFont.systemFont(ofSize: 24)], for: UIControlState.init(rawValue: 0))
        //swift3.x 之前的是 这样写的
//        tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.red], for: .highlighted)

        //会调用pushViewController 方法 将 vc 压栈
        let nav = WBNavigationController(rootViewController: vc)
        return nav
    }
    
}
